//https://www.mmxiaowu.com/article/596cbb2d436eb550a5423c30
import {createApp} from "./app";
import Vue from 'vue';

import iView from 'iview';
Vue.use(iView);
import VueBus from 'vue-bus';
Vue.use(VueBus);


export default (context)=>{
	// 因为有可能会是异步路由钩子函数或组件，所以我们将返回一个 Promise，
  // 以便服务器能够等待所有的内容在渲染前，
  // 就已经准备就绪。
  return new Promise((resolve, reject) => {
    const { app, router, store } = createApp(context);
    // 设置服务器端 router 的位置
    router.push(context.url)
    
    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      console.log('ready');
      app.$options.asyncData({
        store,
        route:router.currentRoute
      },context.user);
      if(!context.user.token){
        router.history.stack.forEach((i)=>{
          if(i.meta.requiresAuth==true){
            //router.push("/login?redirect="+i.fullPath)
            return reject({ code: 302,message:"/login?redirect="+i.fullPath })
          }
        })
      }
      
      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，执行 reject 函数，并返回 404
      if (!matchedComponents.length) {
        return reject({ code: 302,message:'/' })
      }
      //console.log(matchedComponents.length);
      Promise.all(matchedComponents.map(component => {
        
        if (component.asyncData) {
          
          return component.asyncData({
            store,
            route:router.currentRoute
          })
        }
      })).then(() => {
        //console.log('store.state.user',store.state.user);
        context.initialState = store.state;
        resolve(app);
      }).catch(reject)
      // Promise 应该 resolve 应用程序实例，以便它可以渲染
      //resolve(app)
    }, reject)
  })
}